home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d908.lha / DviDvi / PasTeX / MakeTeXFont.rexx
OS/2 REXX Batch file  |  1993-08-28  |  9KB  |  306 lines

  1. /*RX
  2.     MakeTeXFont 0.91 */
  3. /* Send new features and bug reports to
  4.  
  5.    Martin Bokaemper
  6.    Reuthstr. 12
  7.    W-8521 Poxdorf
  8.    Germany
  9.  
  10.    Email: mnbokaem@cip.e-technik.uni-erlangen.de (Internet)
  11.       mab@ame.zer (Zerberus)
  12.  
  13. History:
  14. 0.80: My 'works-fine-for-me' version modified by Georg Hessmann 13.4.91
  15.       + Variables for all directories and filenames
  16.       + ^C and ^D detection
  17.       + support for a 'modefile' containing site-specific information
  18.       + searches for standard magsteps
  19.       + support for different format-files
  20.  
  21. 0.81: + take new Parameters 'drivertype' and 'pkfilename'
  22.       Georg Hessmann 17.4.91
  23.  
  24. 0.82: + History
  25.       + a lot of small improvements and bugfixes
  26.       + looking for PK-directory for each device
  27.       + checking if the font already exists
  28.       Martin Bokaemper 21.4.91
  29.  
  30. 0.84: + add new parameter 'pkdir' (new since driver version V1.10)
  31.       Georg Hessmann 9.6.91
  32.  
  33. 0.85: + fixed a pkdir/pkfilename mixing bug
  34.       + slight modifications, now works with old driver versions
  35.       + changed exit codes
  36.       + always calls uses plain.base (absolutely no gain in using cmbase)
  37.       J\"org H\"ohle    24.6.91, 1-Aug-91
  38.  
  39. 0.86: + fixed makedir(pkname) bug
  40.       J\"org H\"ohle    6-Aug-91
  41.  
  42. 0.90: + add makedir(pkdir)
  43.       + delete localfont entry in 'modes' file
  44.       Georg Hessmann    28-Aug-91
  45.  
  46. 0.91  + add magstep-support for negative numbers
  47.       Jochen Wiedmann    28-Jul-93
  48. */
  49.  
  50. /* TRACE RESULTS */
  51.  
  52. /* files / directories */
  53. logdir         = "MF:log"                 /* directory of the logfiles    */
  54.                     /* without trailing slash!    */
  55. logname      = logdir"/MakeTeXFont.log" /* logfile                      */
  56. modefilename = "MF:config/modes"        /* description of the modes     */
  57. textfm         = "TeX:fonts/"             /* TeX tfm-files directory      */
  58. /*pkdir     "TeX:pk/"                * Where pk fonts are copied to */
  59.  
  60. /* programs: */
  61. virmf  = "TeX:bin/virmf"
  62. gftopk = "TeX:bin/gftopk"
  63.  
  64. /* bases / format-file stuff removed, cmbase only takes disk space &
  65. brings you NOTHING! */
  66. /*cmbase     = "cmbase"*/       /* base file for cm* l* and manfnt fonts */
  67.  
  68. normalbase = "plain"            /* base file for all other fonts        */
  69.  
  70. SIGNAL ON ERROR
  71. SIGNAL ON FAILURE
  72. SIGNAL ON BREAK_C
  73. SIGNAL ON BREAK_D
  74.  
  75. /* TRACE RESULTS */
  76.  
  77. if ~show('Libraries', 'rexxsupport.library') then do
  78.    if ~addlib('rexxsupport.library', 0, -30) then do
  79.       say "no RexxSupport ... no Metafont"
  80.       exit 20
  81.    end
  82. end
  83.  
  84. dummy = time("Reset");
  85.  
  86. IF ~exists(logdir) THEN DO
  87.     CALL makedir(logdir)
  88.     say "logfile-directory ("logdir"/) did not exist. It was created."
  89.     END
  90.  
  91. IF ~exists(logname) THEN DO
  92.     ADDRESS COMMAND 'echo >'||logname
  93.     say "logfile did not exist. It was created."
  94.     END
  95.  
  96. /**** arguments *****/
  97. parse arg fntname dpi hbasedpi vbasedpi drivertype pkfilename pkdir .
  98.  
  99. IF pkdir == "" THEN pkdir = "TeX:pk/"   /* default for driver types < V1.10 */
  100.  
  101. say "Making font with name = "fntname" dpi = "dpi" and base x = "hbasedpi"  y = "vbasedpi
  102.  
  103. mag   = dpi/hbasedpi    /* what magstep should the font have? */
  104.  
  105.  
  106. magmult.0      = 21    /* number of saved magsteps */
  107.  
  108. magmult.num.1  = 1.0    /* magstep(0)   */
  109. magmult.str.1  = "0"
  110. magmult.num.2  = 1.095    /* magstep(0.5) */
  111. magmult.str.2  = "0.5"
  112. magmult.num.3  = 1.2    /* magstep(1)   */
  113. magmult.str.3  = "1"
  114. magmult.num.4  = 1.315    /* magstep(1.5) */
  115. magmult.str.4  = "1.5"
  116. magmult.num.5  = 1.44    /* magstep(2)   */
  117. magmult.str.5  = "2"
  118. magmult.num.6  = 1.577    /* magstep(2.5) */
  119. magmult.str.6  = "2.5"
  120. magmult.num.7  = 1.728    /* magstep(3)   */
  121. magmult.str.7  = "3"
  122. magmult.num.8  = 2.074    /* magstep(4)   */
  123. magmult.str.8  = "4"
  124. magmult.num.9  = 2.488    /* magstep(5)   */
  125. magmult.str.9  = "5"
  126. magmult.num.10 = 2.986    /* magstep(6)   */
  127. magmult.str.10 = "6"
  128. magmult.num.11 = 3.583    /* magstep(7)   */
  129. magmult.str.11 = "7"
  130. magmult.num.12 = 4.300    /* magstep(8)   */
  131. magmult.str.12 = "8"
  132. magmult.num.13 = 5.160    /* magstep(9)   */
  133. magmult.str.13 = "9"
  134. magmult.num.14 = 0.913    /* magstep(-0.5) */
  135. magmult.str.14 = "-0.5"
  136. magmult.num.15 = 0.833    /* magstep(-1)   */
  137. magmult.str.15 = "-1"
  138. magmult.num.16 = 0.761    /* magstep(-1.5) */
  139. magmult.str.16 = "-1.5"
  140. magmult.num.17 = 0.694    /* magstep(-2)   */
  141. magmult.str.17 = "-2"
  142. magmult.num.18 = 0.634    /* magstep(-2.5) */
  143. magmult.str.18 = "-2.5"
  144. magmult.num.19 = 0.579    /* magstep(-3)   */
  145. magmult.str.19 = "-3"
  146. magmult.num.20 = 0.528    /* magstep(-3.5) */
  147. magmult.str.20 = "-3.5"
  148. magmult.num.21 = 0.482    /* magstep(-4)   */
  149. magmult.str.21 = "-4"
  150.  
  151. magmult.str.default = "???"
  152.  
  153. magstr = magmult.str.default
  154.  
  155. eps = 0.005        /* erlaubte Abweichung    */
  156.  
  157. DO i=1 to magmult.0
  158.   IF abs(magmult.num.i - mag) < eps THEN DO
  159.     mag    = magmult.num.i
  160.     magstr = magmult.str.i
  161.     LEAVE i
  162.   END
  163. END
  164.  
  165.  
  166. /* modes ... search the correct mode in the file MF:config/modes */
  167. IF ~open('modefile', modefilename, 'read') THEN DO
  168.   call log("Can't find file "modefilename"!");
  169.   exit 10
  170. END
  171. DO  UNTIL (xres == hbasedpi & yres == vbasedpi) | eof('modefile')
  172.   PARSE VALUE translate(readln('modefile'), '', '2009'X) WITH mode xres yres .
  173. /**
  174.   line = readln('modefile')
  175.   line = strip(translate(line, '', '2009'X))    / * a space and a tab * /
  176.   mode = word(line,1)
  177.   xres = word(line,2)
  178.   yres = word(line,3)
  179.   /* pkdir = word(line,4) */
  180. **/
  181. END
  182. IF ~close('modefile') THEN call log("Can't close mode-file!")
  183. IF xres ~= hbasedpi | yres ~= vbasedpi THEN DO
  184.   call log("Can't find matching mode! Make an update in your "modefilename" file.")
  185.   EXIT 5
  186. END;
  187.  
  188. /* Produce the complete name of the file */
  189. IF pkfilename="" THEN DO
  190.     pkname = pkdir||dpi'/'fntname'.'dpi'pk'
  191. END; ELSE DO
  192.     pkname = pkdir||pkfilename
  193. END
  194.  
  195. /* Looks if the font already is there */
  196. IF exists(pkname) THEN DO
  197.   say "The font "pkname" already exists!"
  198.   say "check your driver's configuration!"
  199.   call log(pkname" already exists")
  200.   EXIT 0
  201. END;
  202.  
  203. /* Metafont options */
  204. IF magstr ~= magmult.str.default THEN
  205.   options = "\mode:="mode"; mag:=magstep("magstr"); input "fntname"; scrollmode"
  206. ELSE
  207.   options = "\mode:="mode"; \mag:="mag"; \input "fntname"; \scrollmode"
  208.  
  209. say "MF commands: '"options"'"
  210.  
  211. /** format file * /
  212. format = cmbase
  213. IF abbrev(fntname, 'cm') | abbrev(fntname, 'l') | abbrev(fntname, 'manfnt') THEN
  214.   format = cmbase
  215. IF abbrev(fntname, 'eu') | abbrev(fntname, 'ms') | abbrev(fntname, 'wn') THEN
  216.   format = normalbase
  217. **/    /* removed, cmbase only consumes disk space & brings you NOTHING! (JCH) */
  218.  
  219. format = normalbase
  220.  
  221. dummy = pragma("directory","MF:");
  222.  
  223. ADDRESS COMMAND
  224.  
  225. /* first: create all needet directories.... */
  226.  
  227.  
  228.   /* Don't include last '/' in pkdir, makedir doesn't like it */
  229. pkdir2 = LEFT(pkdir, LASTPOS("/",pkdir)-1)
  230. IF ~exists(pkdir2) THEN DO
  231.   IF ~makedir(pkdir2) THEN DO
  232.     call log("MakeDir "pkdir2" failed");
  233.     EXIT 10
  234.   END
  235. END
  236.  
  237.   /* a '/' is required to exist in pkname. */
  238.   /* Don't include last '/' in fulldir, makedir doesn't like it */
  239. fulldir = LEFT(pkname, LASTPOS("/",pkname)-1)
  240. IF ~exists(fulldir) THEN DO
  241.   IF ~makedir(fulldir) THEN DO
  242.     call log("MakeDir "fulldir" failed");
  243.     EXIT 10
  244.   END
  245. END
  246.  
  247.  
  248. /* second: create gf-file */
  249. virmf '&'format' "'options'"'
  250.  
  251. /* copy/delete instead rename to overwrite existing logfile (eg. from a
  252.    failed call of MakeTeXfont). Replace by 'move' if you have ARP:
  253.    i.e. add a line here ``copy = "move" or "mv"'' */
  254.  
  255. CALL delete(logdir'/'fntname'.'dpi'log')
  256. CALL rename(fntname'.log', logdir'/'fntname'.'dpi'log')
  257.  
  258. /* tfm-file ?? */
  259. IF exists(textfm) & ~exists(textfm||fntname'.tfm') THEN DO
  260.     copy fntname'.tfm' textfm
  261.     protect textfm||fntname'.tfm' SUB e
  262.     END
  263. CALL delete(fntname'.tfm')
  264.  
  265.  
  266. /* third: create pk-file */
  267. gftopk fntname'.'dpi'gf' pkname
  268.  
  269. IF 0 = RC THEN DO /* never called because of 'signal on failure' ? */
  270.   /* don't delete .gf file on failure */
  271.   protect pkname SUB ew
  272.   filenote pkname '"mode='mode',magstep='magstr'"'
  273.   CALL delete(fntname'.'dpi'gf')
  274.   END
  275.  
  276. elapsed = time("Elapsed");
  277. call log("in "elapsed%3600":"Right(elapsed%60//60,2,'0')":"Right(elapsed%1//60,2,'0'))
  278.  
  279. EXIT 0
  280.  
  281. /**** log - function ****/
  282. log: PROCEDURE EXPOSE logname fntname mode hbasedpi vbasedpi dpi magstr
  283.      PARSE ARG msg
  284.  
  285.      message = date()" "time()": "fntname" for "mode"("hbasedpi","vbasedpi") with "dpi" dpi (mag="magstr") "msg
  286.      say message
  287.      IF ~open(logfile, logname, 'Append') THEN DO
  288.        say "Can't open logfile!"
  289.        RETURN
  290.      END
  291.      dummy = writeln(logfile,message);
  292.      IF ~close(logfile) THEN say "Can't close logfile!"
  293. RETURN
  294.  
  295. /**** signal - functions ****/
  296. error:
  297. failure: call log "errorlevel "rc" in line "sigl": "sourceline(sigl)
  298.      EXIT 10
  299.  
  300. BREAK_C:
  301. BREAK_D:
  302.      call log "execution aborted!"
  303.      IF exists(fntname'.'dpi'gf') THEN dummy = delete(fntname'.'dpi'gf')
  304.      IF exists(fntname'.log') THEN dummy = delete(fntname'.log')
  305.      EXIT 5
  306.